﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace _01_线程阻塞
{
    // 线程主要是为了解决线程阻塞问题，当有复杂的代码或者比较耗时的代码需要执行时，则需要放到线程中 防止阻塞主线程 
    // 多线程可以提升程序执行的速度，提高性能 

    // 让线程阻塞 
    // 吃饭这个任务需要在饭做好之后才能执行 
    // 打游戏不需等待饭做好


    // 什么时候使用线程阻塞 
    // 当一个任务依赖于另一个任务执行的结果时 就需要使用线程阻塞 
    internal class Program
    {
        static void Main(string[] args)
        {
            //Eat();
            Play();
            Console.ReadLine();
        }

        /// <summary>
        /// 一个做饭的任务 
        /// </summary>
        static Thread Cook()
        {
            Thread thread = new Thread(() =>
            {
                Console.WriteLine("正在烹饪中。。。");
                Thread.Sleep(2000);
                Console.WriteLine("饭做好了");
            });
            thread.Start();
            return thread; // 返回做饭的线程
        }

        static Thread Eat()
        {
            Thread thread = new Thread(() =>
            {
                Console.WriteLine("准备吃饭");
                Thread cook = Cook(); // 调用做饭的方法开始做饭 
                cook.Join();// 阻塞线程 等待饭做好之后才能进行下一步操作

                Console.WriteLine("开始吃饭");
            });
            thread.Start();
            return thread;
        }

        static Thread Play()
        {
            Thread thread = new Thread(() =>
            {
                Console.WriteLine("准备打游戏");
                Cook(); // 打游戏的同时开始做饭 
                Console.WriteLine("开始打游戏");
            });
            thread.Start();
            return thread;
        }
    }


}
